Docker Compose 架設 SQL Server 權限問題解決方案
TLDR
- SQL Server 容器以非 root 使用者 (UID 10001) 執行,若掛載的 Volume 目錄權限不符,會導致
Access is denied錯誤。 - 解決方案:在啟動容器前,必須先手動建立 Volume 目錄,並將其擁有者變更為 UID 10001。
- 核心指令:
chown -R 10001:0 volumes。 - 注意事項:SQL Server 2025 映像檔中,
sqlcmd的路徑已變更為/opt/mssql-tools18/bin/sqlcmd。
問題情境:SQL Server 容器啟動失敗
當使用 Docker Compose 掛載本機目錄至 SQL Server 容器時,若該目錄的權限未正確設定,容器會因為無法存取預設的資料夾路徑而啟動失敗,並出現以下錯誤:
bash
ERROR: BootstrapSystemDataDirectories() failure (HRESULT 0x80070005)
00:01:10.10 Server ERROR: Setup FAILED copying system data file 'C:\templatedata\master.mdf' to '/var/opt/mssql/data/master.mdf': 5(Access is denied.)什麼情況下會遇到這個問題:在 Linux 或 WSL 環境下,將本機目錄掛載至 SQL Server 容器的 /var/opt/mssql/data 等預設路徑,且該目錄的擁有者並非容器內的 mssql 使用者 (UID 10001) 時會發生。
正規解決方案
為了確保資料持久化且避免權限衝突,建議採取以下步驟進行設定:
1. 建立資料夾結構
在 docker-compose.yml 所在的目錄下,手動建立必要的子資料夾,確保目錄結構完整:
bash
mkdir -p volumes/data volumes/log volumes/backup2. 設定資料夾權限
將目錄的擁有者變更為 SQL Server 容器內的 mssql 使用者 (UID 10001):
bash
chown -R 10001:0 volumesTIP
實測發現,大多數情況下僅需執行 chown -R 10001:0 volumes 即可解決權限問題。
3. 啟動容器
完成權限設定後,即可正常啟動容器:
bash
docker-compose up -d為什麼需要這樣設定?
SQL Server 映像檔內預定義了 mssql 使用者(UID 10001)。當 Docker 掛載本機目錄時,若該目錄由 root 或當前使用者擁有,容器內的 mssql 使用者將沒有寫入權限,導致系統資料檔無法複製到掛載的 Volume 中。
指令解析
chown -R 10001:0 volumes:將volumes目錄及其子目錄的擁有者改為 UID 10001,群組設為 0 (root)。- 避免依賴「失敗後自動建立目錄」:若未先建立目錄直接設定權限,Docker 可能無法正確套用權限,導致容器啟動時因權限不足而再次失敗。
注意事項:SQL Server 版本差異
WARNING
在 SQL Server 2025 映像檔中,sqlcmd 的路徑已從 /opt/mssql-tools/bin/sqlcmd 變更為 /opt/mssql-tools18/bin/sqlcmd。若您的 healthcheck 設定包含此路徑,請務必進行對應調整。
異動歷程
- 初版文件建立。
- 補充完整操作步驟,說明需先建立子資料夾再設定權限。
- 新增權限設定簡化方案的 tip 說明,指出大多數情況下只需執行第三個指令。
- 補充 SQL Server 2025 的 mssql-tools 路徑變更資訊。